home *** CD-ROM | disk | FTP | other *** search
/ Power CD / Power CD ATARI-Rechner Lieben.iso / UTILITY / PROFILER / KOMPOSER.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1989-06-16  |  6.6 KB  |  186 lines

  1. PROGRAM Computer_Composition; { 7. Bundeswettbewerb Informatik 1988/1989 }
  2.                               { 1. Runde,Aufgabe 1 ; Autor M.Berger      }
  3.                               {   Hinweise am Ende des Files beachten !  }
  4.  
  5.   
  6.   CONST Max_Laenge_Motiv        = 20;
  7.         Max_Anzahl_Toene        = 10;
  8.         Max_Anzahl_Schritte     = 20;
  9.   TYPE  Abbildungsregel_DEF     = RECORD
  10.                                     Alt       : CHAR;
  11.                                     Neu       : CHAR;
  12.                                   END;
  13.         Wandlungs_ART    = (Thema,Variation);
  14.       
  15.   VAR   Satzform                         : ARRAY[1..Max_Anzahl_Schritte] OF
  16.                                                  Wandlungs_ART;
  17.         Anzahl_Schritte                  : INTEGER;
  18.         Abbildungsregel                  : ARRAY[1..Max_Anzahl_Toene] 
  19.                                                  OF Abbildungsregel_DEF;
  20.         Anzahl_Toene                     : INTEGER;
  21.         Motiv                            : ARRAY[1..Max_Laenge_Motiv] OF
  22.                                                 CHAR;
  23.         Motivlaenge                           : INTEGER;
  24.         Prestofaktor                     : REAL;
  25.         Anzahl_Saetze                    : INTEGER;
  26.         Tondauer                         : REAL;
  27.         i                                : INTEGER;
  28.         
  29.  PROCEDURE Eingabe;
  30.    VAR i : INTEGER;
  31.        x : CHAR;
  32.    BEGIN
  33.      CLRSCR;WRITELN('Computer-Composition  (bwINF 7 [88/89];Aufgabe 1)');
  34.      WRITELN;WRITELN;
  35.      
  36.      Anzahl_Toene:=0;
  37.      REPEAT
  38.        Anzahl_Toene:=Anzahl_Toene+1;
  39.        WRITE('  Bitte Ton angeben : ');
  40.        READ(kbd,Abbildungsregel[Anzahl_Toene].Alt);
  41.        WRITE(Abbildungsregel[Anzahl_Toene].Alt);
  42.        IF Abbildungsregel[Anzahl_Toene].Alt<>' ' THEN
  43.        BEGIN
  44.          WRITE(' ; Wird abgebildet auf : ');
  45.          READ(kbd,Abbildungsregel[Anzahl_Toene].Neu);
  46.          WRITE(Abbildungsregel[Anzahl_Toene].NEU);
  47.        END;
  48.        WRITELN;
  49.      UNTIL (Anzahl_Toene=Max_Anzahl_Toene) OR 
  50.            (Abbildungsregel[Anzahl_Toene].Alt=' ');
  51.      Anzahl_Toene:=Anzahl_Toene-1;
  52.      WRITELN;
  53.      
  54.      Motivlaenge:=0;
  55.      REPEAT
  56.        Motivlaenge:=Motivlaenge+1;
  57.        WRITE('  Bitte Ton des Themas angeben : ');
  58.        READ(kbd,Motiv[Motivlaenge]);WRITELN(Motiv[Motivlaenge]);
  59.      UNTIL (Motiv[Motivlaenge]=' ') OR (Motivlaenge>Max_Laenge_Motiv);
  60.      Motivlaenge:=Motivlaenge-1;
  61.      WRITELN;
  62.      
  63.      Anzahl_Schritte:=0;
  64.      REPEAT
  65.        Anzahl_Schritte:=Anzahl_Schritte+1;
  66.        WRITE('  Soll Thema (u)nverändert bleiben oder (v)ariiert werden ');
  67.        READ(kbd,x);
  68.        WRITELN(x);
  69.        IF UPCASE(X)='V' THEN
  70.          Satzform[Anzahl_Schritte]:=Variation;
  71.        IF UPCASE(x)='U' THEN
  72.          Satzform[Anzahl_Schritte]:=Thema;
  73.      UNTIL ((UPCASE(x)<>'V') AND (UPCASE(x)<>'U')) OR
  74.            (Anzahl_Schritte>Max_Anzahl_Schritte);
  75.      Anzahl_Schritte:=Anzahl_Schritte-1;
  76.      WRITELN;
  77.      
  78.      WRITE('  Bitte Anzahl Sätze angeben : ');
  79.      READLN(Anzahl_Saetze);
  80.      
  81.      WRITE('  Bitte Tondauer im ersten Satz angeben : ');
  82.      READLN(Tondauer);
  83.      
  84.      WRITE('  Bitte Prestofaktor angeben : ');
  85.        READLN(Prestofaktor);
  86.    END;
  87.  
  88.  PROCEDURE Gib_Saetze_aus;
  89.    VAR i,u : INTEGER;
  90.        x   : CHAR;
  91.    
  92.    PROCEDURE bilde_Satz (Schachtelung,Variationen : INTEGER);
  93.      
  94.      FUNCTION variiert (Note : Char) : Char ;
  95.        VAR i : INTEGER;
  96.            x : CHAR;
  97.        BEGIN
  98.          FOR i:=1 TO Anzahl_Toene DO
  99.            IF Abbildungsregel[i].Alt=Note THEN x:=Abbildungsregel[i].Neu;
  100.          variiert:=x;
  101.        END;
  102.      
  103.      VAR i,u    : INTEGER;
  104.          x      : CHAR;
  105.      BEGIN
  106.        IF Schachtelung>0 THEN
  107.          FOR i:=1 TO Anzahl_Schritte DO
  108.            IF Satzform[i]=Thema THEN
  109.              bilde_Satz(Schachtelung-1,Variationen)
  110.                                   ELSE
  111.              bilde_Satz(Schachtelung-1,Variationen+1)
  112.        ELSE
  113.        BEGIN
  114.          FOR i:=1 TO Motivlaenge DO
  115.          BEGIN
  116.              x:=Motiv[i];
  117.              IF Variationen>0 THEN
  118.                FOR u:=1 TO Variationen DO
  119.                  x:=variiert(x);
  120.              WRITE(x);
  121.          END;
  122.          WRITE(' ');
  123.        END;
  124.      END;
  125.    
  126.    BEGIN
  127.      FOR i:=1 TO Anzahl_Saetze DO
  128.      BEGIN
  129.        CLRSCR;WRITE('Computer-Composition :  -');
  130.        FOR u:=1 TO Motivlaenge DO WRITE(Motiv[u]);
  131.        WRITE('- ; Satz ',i,' ; Tondauer : ');
  132.        IF i>1 THEN Tondauer:=Tondauer/Prestofaktor;
  133.        WRITELN(Tondauer:3:2);
  134.        WRITELN;WRITE(' ');
  135.        bilde_Satz(i,0);
  136.        READ(kbd,x);
  137.      END;
  138.    END;
  139.    
  140.  BEGIN
  141.    Eingabe;
  142.    Gib_Saetze_aus;
  143.  END.
  144.  
  145. {
  146.  Problemstellung :
  147.  
  148.  Sue Dama ist bekannt für ihre anspruchsvollen Kompositionen. Sie benutzt
  149.  immer nur die fünf Tonstufen C,D,F,G und A.
  150.  Zunächst gibt sie ein Thema aus n gleichlangen Tönen vor. Jede Tonstufe kann
  151.  dabei mehrfach, einfach oder gar nicht vorkommen. Ein Thema für n=4 ist
  152.  zum Beispiel "AGCA"
  153.  Weiter denkt sie sich eine Abbildungsregel zwischen den Tonstufen aus, deren
  154.  Anwendung auf das Thema automatisch eine Variation ergibt. Die Abbildungs-
  155.  regel " C->F,D->D,F->D,G->C,A->G " ergibt für das Beispielthema die Variation
  156.  "GCFG".
  157.  Jetzt wählt sie noch eine Satzform, die aus einer beliebigen Aneinanderreihung
  158.  von Thema und Variation besteht. Für die Satzform "Thema-Variation-Variation-
  159.  Thema" sieht der erste Satz ihrer Komposition im Beispiel nun so aus :
  160.  "AGCA GCFG GCFG AGCA".
  161.  Den zweiten Satz komponiert Sue Dama, indem sie den ganzen ersten Satz als
  162.  Thema nimmt, und die Abbildungsregel und die Abbildungsregel und die Satzform
  163.  darauf wiederholt. Für das Beispiel lautet der zweite Satz damit :
  164.  "AGCAAGCFGGCFGAGCAGCFGCFDCCFDCGCFGGCFGCFDCCFDCGCFGAGCAAGCFGGCFGAGCA".
  165.  Weil der zweite Satz viel mehr Töne hat alsder erste, spielt ihn Sue Dama um
  166.  einen Prestofaktor schneller. Ist der Prestofaktor etwa gleich 2.0, dann
  167.  dauern alle Töne nur halb so lang wie im vorhergehenden Satz.
  168.  Der dritte, noch schnellere Satz ergibt sich aus dem zweiten, ebenso wie der
  169.  zweite aus dem ersten Satz. Der vierte Satz ergibt sich analog aus dem dritten
  170.  usw.
  171.  Schreibe ein Programm, das im Stil von Sue Dama komponiert, wenn man ihm ein
  172.  Thema, eine Abbildungsregel, eine Satzform, die Anzahl der gewünschten Sätze,
  173.  die Tondauer im ersten Satz und einen Prestofaktor eingibt.
  174.  
  175.  Beispiel :
  176.  
  177.  Thema,Abbildungsregel und Satzform wie oben besprochen.
  178.  Anzahl Sätze : 3; Prestofaktor 2; Tonlänge am Anfang 1.
  179.  Ergebnisse wie oben angeführt.
  180.   
  181.  Besonderheiten :
  182.  
  183.  Rekursion, Variablen, IF-THEN-Strukturen ohne Semikolons/ENDs.
  184.  
  185. }